package vista;

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.SwingConstants;

import controlador.ControladorCliente;

public class TelaChat extends JFrame{
	
	private static final long serialVersionUID = 6186736747751819784L;
	private JFrame janelaPrincipal;
	private JPanel painelPrincipal;
	private JTabbedPane abasConversas;
	
	//Componentes da tela
	private JScrollPane scrollListaUsuarios;
	private JTextField field;
	private JList<String> listaUsuarios;
	private DefaultListModel<String> listaItensUsuarios;
	
	private static final Integer ALTURA = 400, LARGURA = 600, X_INICIAL = 100, Y_INICIAL = 100;
	private List<String> usuarios;
	private String nome;
	private ControladorCliente controladorCliente;
	private Map<JLabel, List<String>> mapaConversas;
	private List<JLabel> conversas;
	
	public TelaChat(List<String> clientes, String nome) {
		this.usuarios = clientes;
		this.nome = nome;
		this.controladorCliente = ControladorCliente.getControladorCliente();
		this.mapaConversas = new HashMap<JLabel, List<String>>();
		this.conversas = new ArrayList<JLabel>();
		criaTela();
		criaPainel();
		criaComponentes();
		exibeTela();
	}
	
	public void criaTela() {
		janelaPrincipal = new JFrame("Chat - Logado como " + this.nome);
		janelaPrincipal.setBounds(X_INICIAL, Y_INICIAL, LARGURA, ALTURA);
		janelaPrincipal.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		janelaPrincipal.addWindowListener(new WindowAdapter() {  
			@Override  
			public void windowClosing(WindowEvent e) {  
				controladorCliente.finalizaConexoes();
				System.exit(0);
			}  
		}); 
	}
	
	private void exibeTela() {
		janelaPrincipal.setVisible(true);
	}
	
	public void criaPainel() {
		painelPrincipal = new JPanel();
		painelPrincipal.setLayout(null);
		janelaPrincipal.add(painelPrincipal);
	}
	
	public void criaComponentes() {
		//Criar painel da aba
		JPanel aba = new JPanel();
		aba.setLayout(new GridLayout());
		
		//Criar aba
		abasConversas = new JTabbedPane();
		abasConversas.addTab("Todos", aba);
		
		painelPrincipal.add(abasConversas);
		abasConversas.setBounds((int)(0.03*LARGURA), (int)(0.03*ALTURA), (int)(0.7*LARGURA), (int)(0.6*ALTURA));
		
		//Criar o JLabel
		JLabel conversa;
		conversa = new JLabel();
		conversa.setVerticalAlignment(JLabel.TOP);
		conversa.setVerticalTextPosition(SwingConstants.TOP);
		conversa.setHorizontalTextPosition(SwingConstants.LEFT); 
		mapaConversas.put(conversa, usuarios);
		conversas.add(conversa);
		
		JScrollPane scrollConversa = new JScrollPane(conversa);
		scrollConversa.setHorizontalScrollBar(null);
		aba.add(scrollConversa);
		
		//Criar o JList
		listaItensUsuarios = new DefaultListModel<String>();
		listaUsuarios = new JList<String>(listaItensUsuarios);
		listaUsuarios.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
//		listaUsuarios.addListSelectionListener(new OuvinteListaUsuarios());
//		listaUsuarios.addMouseListener(new OuvinteListaLoja());

		for (String usuario : usuarios) {
			listaItensUsuarios.addElement(usuario);
		}

		scrollListaUsuarios = new JScrollPane(listaUsuarios);
		scrollListaUsuarios.setHorizontalScrollBar(null);
		painelPrincipal.add(scrollListaUsuarios);
		scrollListaUsuarios.setBounds((int)(0.75*LARGURA), (int)(0.03*ALTURA), (int)(0.2*LARGURA), (int)(0.6*ALTURA));
		
		//Criar o JTextField
		field = new JTextField();
		
		field.addKeyListener(new KeyAdapter() {
			
			public void keyPressed(final KeyEvent e) {  
				int key = e.getKeyCode();  
				if (key == KeyEvent.VK_ENTER) { 
					if(field.getText().trim().equals("") == false) {
						mensagemParaEnviar(mapaConversas.get(conversas.get(abasConversas.getSelectedIndex())), field.getText());
					}
				}  
			}  
		});  
  
		painelPrincipal.add(field);
		field.setBounds((int)(0.03*LARGURA), (int)(0.68*ALTURA), (int)(0.7*LARGURA), (int)(0.2*ALTURA));
		
		//Criar o JButton de nova conversa
		JButton botaoNovaConversa = new JButton("Iniciar conversa");
		botaoNovaConversa.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent arg0) {
				List<String> membrosNovaConversa = listaUsuarios.getSelectedValuesList();
				adicionarAba(membrosNovaConversa.toString(), membrosNovaConversa);
			}
		});
		
		painelPrincipal.add(botaoNovaConversa);
		botaoNovaConversa.setBounds((int)(0.75*LARGURA), (int)(0.68*ALTURA), (int)(0.2*LARGURA), (int)(0.2*ALTURA));
	}
	
	public void atualizaListaUsuarios(List<String> clientes) {
		this.usuarios.clear();
		this.usuarios.addAll(clientes);
		listaItensUsuarios.clear();
		
		for (String usuario : usuarios) {
			listaItensUsuarios.addElement(usuario);
		}
	}
	
	public void mensagemParaEnviar(List<String> membrosConversa, String mensagem) {
		if(membrosConversa.toString().equals("[]") == true) return;
		mensagem = nome + ": " + mensagem;
		controladorCliente.enviarMensagem(membrosConversa, mensagem);
	}
	
	public JLabel adicionarAba(String nome, List<String> membrosConversa) {
		JPanel aba = new JPanel();
		aba.setLayout(new GridLayout());
		
		//Criar aba
		abasConversas.addTab(nome, aba);
		
		JLabel conversa = new JLabel();
		conversa.setVerticalAlignment(JLabel.TOP);
		conversa.setVerticalTextPosition(SwingConstants.TOP);
		conversa.setHorizontalTextPosition(SwingConstants.LEFT);
		
		mapaConversas.put(conversa, membrosConversa);
		conversas.add(conversa);
		
		JScrollPane scrollConversa = new JScrollPane(conversa);
		scrollConversa.setHorizontalScrollBar(null);
		aba.add(scrollConversa);
		
		return conversa;
	}

	public void removerAba(int indice) {
		if (indice != -1) {
		   abasConversas.remove(indice);
	    }
	}
	
	public synchronized void atualizaLabel(List<String> membrosConversa, String mensagem) {
		boolean acheiConversa = false;
		JLabel conversa = new JLabel();
		
		for(JLabel label : mapaConversas.keySet()) {
			int membrosIguais = 0;
			
			for(String membro : membrosConversa) {
				if(mapaConversas.get(label).contains(membro) == true) membrosIguais++;
				else break;
			}
			
			if(membrosIguais == membrosConversa.size() && membrosIguais == mapaConversas.get(label).size()) {
				acheiConversa = true;
				conversa = label;
				break;
			}
		}
		
		if(acheiConversa == false) {
			conversa = adicionarAba(membrosConversa.toString(), membrosConversa);
		}
		
		conversa.setText(conversa.getText().replace("<html>", ""));
		conversa.setText(conversa.getText().replace("</html>", ""));
		conversa.setText("<html>  " + conversa.getText() + "<br>  " + mensagem + "</html>");
		field.setText("");
	}
	
}
